﻿// ===============================================================================
//  Copyright © ymind.net. All rights reserved .
//  官方网站：http://ymind.net/
//  版权所有：彦铭工作室 老陈出品
// ===============================================================================

using System;
using System.Runtime.InteropServices;
using Lcsoft.TemplateEngine.Core;

namespace Lcsoft.TemplateEngine.Tags
{
	/// <summary>
	/// 表示指示是否对其（.css 或 .js 文件）进行打包处理的配置型语句标签。
	/// </summary>
	[ComVisible(true)]
	[Serializable]
	public sealed class PackingTag : ConfigurationElement
	{
		/// <summary>
		/// 初始化 <see cref="PackingTag"/> 类的新实例。
		/// </summary>
		/// <param name="prefix">模板引擎语句标签的前缀名。</param>
		/// <param name="line">标签所在的行数。</param>
		/// <param name="column">标签所在的列数。</param>
		public PackingTag(string prefix, int line, int column) : base(prefix, "packing", line, column) { }

		/// <summary>
		/// 获取要参与打包的文件的路径的匹配字符串，凡与此匹配的文件都会被打包处理。
		/// </summary>
		public string Match
		{
			get { return this.GetAttributeValue("match"); }
		}

		/// <summary>
		/// 获取要参与打包的文件的类型。
		/// </summary>
		public PackingKind Type
		{
			get
			{
				var value = this.GetAttributeValue("type");

				if (String.Compare(value, "StyleSheet", StringComparison.OrdinalIgnoreCase) != 0 && String.Compare(value, "Javascript", StringComparison.OrdinalIgnoreCase) != 0) value = "None";

				var type = TemplateEngineHelper.GetEnum<PackingKind>(value);

				if (type == PackingKind.None) throw new ParseException("语法错误", String.Format("<{0}:packing /> 标签的 type 属性值必须指定为 StyleSheet 或 Javascript 中的一项。(行：{1}，列：{2})", this.Prefix, this.Line, this.Column));

				return type;
			}
		}

		/// <summary>
		/// 获取要参与打包的文件的从应用程序根目录开始的相对根路径。
		/// </summary>
		public string FileName
		{
			get
			{
				var fileName = this.GetAttributeValue("file");

				if (String.IsNullOrWhiteSpace(fileName)) fileName = this.Match;

				return fileName;
			}
		}
	}
}
